package site.shenjie.eureka.ribbon.feign.config;

import feign.Logger;
import feign.Request;
import feign.auth.BasicAuthRequestInterceptor;
import feign.codec.Decoder;
import feign.codec.Encoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import site.shenjie.eureka.ribbon.feign.interceptor.FeignBasicAuthRequestInterceptor;


@Configuration
public class FeignConfiguration {
    /**
     * 日志级别
     * PS:
     * NONE：        不输出日志。
     * BASIC：       只输出请求方法的 URL 和响应的状态码以及接口执行的时间。
     * HEADERS：     将 BASIC 信息和请求头信息输出。
     * FULL：        输出完整的请求信息。
     */
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

    /**
     * 超时时间配置
     */
    @Bean
    public Request.Options options() {
        // 连接超时时间：5000ms，读取超时时间：10000ms
        return new Request.Options(5000, 10000);
    }

    /**
     * 编码器
     */
    @Bean
    public Encoder encoder() {
        return new MyEncoder();
    }

    /**
     * 解码器
     */
    @Bean
    public Decoder decoder() {
        return new MyDecoder();
    }

    /**
     * Basic认证
     * 通常我们调用的接口都是有权限控制的，很多时候可能认证的值是通过参数去传递的，
     * 还有就是通过请求头去传递认证信息，
     * 比如 Basic 认证方式。
     * 在 Feign 中我们可以直接配置 Basic 认证，代码如下所示:
     */
    @Bean
    public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
        System.out.println("声明基本认证...");
        return new BasicAuthRequestInterceptor("user", "password");
    }

    /**
     * 自定义认证
     */
    @Bean
    public FeignBasicAuthRequestInterceptor feignBasicAuthRequestInterceptor() {
        System.out.println("声明自定义认证...");
        return new FeignBasicAuthRequestInterceptor();
    }
}
